/**
主要回顾：static 修饰符

static 修饰成员变量（静态成员变量）时，该变量只有一份存在于方法区，成为一份共享数据
    静态成员变量的访问方式：
        方式一：使用对象进行访问：对象.属性名
        方式二：使用类名进行访问：类名.属性名
    注意：
        1. 非静态成员变量不能通过类名访问，只能通过对象进行访问
        2. 不要为了方便而使用静态成员变量，其用途是为了共享数据（内存中只存一份）。

static 修饰成员方法（静态成员方法）时，可以不创建对象，直接通过类名访问，一般用于工具类方法（典型的：System.out.println()）

类当使用到时才会加载到内存中；
而当类被加载时，静态成员变量会加载到静态数据共享区（方法区里）；普通方法和静态方法会加载到栈内存；
而当类被实例化（创建对象）时，普通成员变量才会在堆内存里被创建。
即：静态数据优先于对象存在
*/

class Student{
    String name;    //每个对象有各自的 name，各自修改各不影响
    static String country = "中国";    //所有对象共享一个 country（意味着某个对象改变它，其他对象获取到的也会变）
    
    //构造方法
    public Student(String name){
        this.name = name;
    }
    
    //非静态成员函数
    public void study(){
        System.out.println("good good study, day day up...");
    }
    
    //静态成员函数
    public static void sleep(){
        System.out.println("hu hu hu~~~" + country);
//        System.out.println("hu hu hu~~~" + this.country);    //报错：静态方法不能使用 this
//        System.out.println("hu hu hu~~~" + name);            //报错：静态方法不能直接使用非静态变量（因为此时还没有对象）
    }
}


class LearnStatic {
    public static void main(String[] args) {
        
        //通过对象访问
        Student s = new Student("Chuck");
        s.study();
        s.sleep();
        System.out.println("学生：" + s.name + " 国籍： " + s.country);
        
        //不创建对象，直接通过类名访问
        Student.sleep();
        System.out.println("国籍： " + Student.country);
//        Student.study();        //报错：study 不是静态成员方法
//        System.out.println("学生：" + Student.name + " 国籍： " + Student.country);    //报错：name 不是静态成员变量
        
    }
}